package mx.frantor.catalogos.daoimp;

import java.util.List;
import java.util.StringTokenizer;

import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import flex.messaging.io.ArrayCollection;

import mx.frantor.catalogos.dao.ProductosExistenciaDAO;
import mx.frantor.catalogos.entitys.CatalogoProductoEntity;
import mx.frantor.catalogos.entitys.ProductosExistenciasEntity;
import mx.frantor.util.HibernateUtil;

public class ProductosExistenciaDAOImpl implements ProductosExistenciaDAO{

	@Override
	public String agregarProductosExistencias(
			ProductosExistenciasEntity nuevoUsuario) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		
		session.beginTransaction();
		try {
		session.save(nuevoUsuario);
		session.flush();
		session.getTransaction().commit();
		e = nuevoUsuario.getIdProducto().toString();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();

			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("agregar productos existencia resultado " + e);
		return e;
	}

	@Override
	public String modificarProductosExistencias(
			ProductosExistenciasEntity modificarUsuario) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			ProductosExistenciasEntity usuariosTemp = (ProductosExistenciasEntity) session.get(
					ProductosExistenciasEntity.class, modificarUsuario.getIdProducto());
		session.flush();
		session.evict(usuariosTemp);
		session.update(modificarUsuario);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("modificar productos existencia resultado " + e);
		return e;
	}

	@Override
	public String eliminarProductosExistencias(Long idProductosExistencias) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		

			// TODO Auto-generated method stub			
			session.beginTransaction();
			try {
				ProductosExistenciasEntity usuarioElimina = (ProductosExistenciasEntity) session.get(
						ProductosExistenciasEntity.class, idProductosExistencias);
			session.delete(usuarioElimina);
			session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
			HibernateUtil.getSessionFactory().getCurrentSession().close();
			System.out.println("eliminar productos existencia resultado " + e);

		return e;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ProductosExistenciasEntity> getTodosProductosExistenciasActivos() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<ProductosExistenciasEntity> usuarios = session.createCriteria(ProductosExistenciasEntity.class)
				.addOrder(Order.asc("Nombre")).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return usuarios;
	}

	@SuppressWarnings("unchecked")
	@Override
	public ProductosExistenciasEntity getProductosExistenciasId(
			Long idProductosExistencias) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<ProductosExistenciasEntity> usuario = (List<ProductosExistenciasEntity>) session.createCriteria(ProductosExistenciasEntity.class)
				.add(Restrictions.eq("IdProducto", idProductosExistencias))
				.setFetchSize(1).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		if(usuario==null){
			return null;
		}else{
			return usuario.get(0);
		}
	}
	
	

	@SuppressWarnings("unchecked")
	@Override
	public List<ProductosExistenciasEntity> getProductosExistenciasPorId(
			Long idProductosExistencias) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<ProductosExistenciasEntity> usuario = (List<ProductosExistenciasEntity>) session.createCriteria(ProductosExistenciasEntity.class)
				.add(Restrictions.eq("IdProducto", idProductosExistencias))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return usuario;
	}
	public String agregarProductosExistencia(ProductosExistenciasEntity nuevoProd, ArrayCollection catProds) {
		String errRslt = "";
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		try{
			session.save(nuevoProd);//<<---Guardamos en la DB
			long idProd = nuevoProd.getIdProducto();
			
			//System.out.println("Size FlexCollection: " + reqUtil.size() + " Vals: " + reqUtil);
			String cantidadMP;
			String idMP;
			String idRef;
			
			for(int i = 0; i < catProds.size(); i++){
				StringTokenizer token = new StringTokenizer(String.valueOf(catProds.get(i).toString()),"=,");
				token.nextToken();
				idMP = token.nextToken();
				System.out.println(idMP);
				token.nextToken();
				cantidadMP = token.nextToken();
				token.nextToken();
				idRef = token.nextToken();
				
				//token.nextToken();
				
				idRef = idRef.substring(0, idRef.length()-1);
				System.out.println(cantidadMP);
				System.out.println(idProd);
				
				
				CatalogoProductoEntity CatalogoProductoEntity = new CatalogoProductoEntity();
				CatalogoProductoEntity.setIdProducto(idProd);
				CatalogoProductoEntity.setIdMateria(Long.valueOf(idMP));
				CatalogoProductoEntity.setCantidad(Float.valueOf(cantidadMP));
				CatalogoProductoEntity.setIdRefaccion(Long.valueOf(idRef));
				session.save(CatalogoProductoEntity);
				
			}
			session.flush();
			session.getTransaction().commit();
			 //<--Realizamos commit de operacion en db
		
			
		}catch (Exception e) {
			
			session.getTransaction().rollback();
			errRslt = e.getMessage();
			System.out.println("Error en agrega Requisicon con detalle implement: " + errRslt);
			
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println(errRslt);
		return errRslt;
	}

	public ProductosExistenciasEntity getProductossPorClave(String clave) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		@SuppressWarnings("unchecked")
		List<ProductosExistenciasEntity> list = session.createCriteria(ProductosExistenciasEntity.class)
			.add(Restrictions.eq("Clave", clave)).list();
		session.getSessionFactory().getCurrentSession().close();
		try{
			return list.get(0);
		}catch(Exception err){
			return null;
		}
	}
	
	public String modificarProductosCantidad(Long idProductosExistencias,
			Float cantidad) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			ProductosExistenciasEntity PExistenciaTemp = (ProductosExistenciasEntity) session.get(
					ProductosExistenciasEntity.class, idProductosExistencias);
		session.flush();
		session.evict(PExistenciaTemp);
		PExistenciaTemp.setCantidad(PExistenciaTemp.getCantidad()+cantidad);
		session.update(PExistenciaTemp);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return e;
	}
	
	public String restarProductosCantidad(Long idProductosExistencias,
			Float cantidad) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			ProductosExistenciasEntity PExistenciaTemp = (ProductosExistenciasEntity) session.get(
					ProductosExistenciasEntity.class, idProductosExistencias);
		session.flush();
		session.evict(PExistenciaTemp);
		PExistenciaTemp.setCantidad(PExistenciaTemp.getCantidad()-cantidad);
		session.update(PExistenciaTemp);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return e;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ProductosExistenciasEntity> getStock(){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
	
		List<ProductosExistenciasEntity> usuario = (List<ProductosExistenciasEntity>) session.createCriteria(ProductosExistenciasEntity.class)
				.add(Restrictions.leProperty("Cantidad", "Minimo"))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return usuario;
	}

}
